package com.lynn.common.utils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

//import androidx.core.app.ActivityCompat;
//import androidx.core.content.FileProvider;
//import androidx.recyclerview.widget.DefaultItemAnimator;
//import androidx.recyclerview.widget.RecyclerView;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class AppUtil {

    private static Boolean isDebug = null;

    public static boolean isDebug() {
        return isDebug != null && isDebug;
    }

    /**
     * Sync lib debug with app's debug value. Should be called in module Application
     *
     * @param context
     */
    public static void syncIsDebug(Context context) {
        if (isDebug == null) {
            isDebug = context.getApplicationInfo() != null &&
                    (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        }
    }


// *************************************************************************
// apk 安装
// *************************************************************************

//    public static void installApk(Context context, File apkFile) {
//        Intent intent = new Intent(Intent.ACTION_VIEW);
//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        Uri uri = null;
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//            uri = FileProvider.getUriForFile(context, getPackageName(context) + ".fileprovider",
//                    apkFile);
//        } else {
//            uri = Uri.fromFile(apkFile);
//        }
//        if (uri != null) {
//            intent.setDataAndType(uri, "application/vnd.android.package-archive");
//            context.startActivity(intent);
//        }
//    }


// *************************************************************************
// 设备相关
//    有很多场景和需求你需要用到手机设备的唯一标识符。（不管怎么取，最好能在本地保存一份）
// *************************************************************************

    /**
     * 判断应用是否已经启动
     *
     * @param context     一个context
     * @param packageName 要判断应用的包名
     * @return boolean
     */
    public static boolean isAppAlive(Context context, String packageName) {
        boolean isActive = false;
        ActivityManager activityManager = ((ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE));
        if (Build.VERSION.SDK_INT >= 21) {
            List<ActivityManager.RunningAppProcessInfo> processInfos = activityManager.getRunningAppProcesses();
            for (int i = 0; i < processInfos.size(); i++) {
                if (processInfos.get(i).processName.equals(packageName)) {
                    Log.i("NotificationLaunch",
                            String.format("the %s is running, isAppAlive return true", packageName));
                    isActive = true;
                    break;
                }
            }
            Log.i("NotificationLaunch",
                    String.format("the %s is not running, isAppAlive return false", packageName));
        } else {
            //getRunningTasks() is deprecated since API Level 21 (Android 5.0)
            List<ActivityManager.RunningTaskInfo> taskInfos = activityManager.getRunningTasks(20);
            for (ActivityManager.RunningTaskInfo info : taskInfos) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    String topAcName = info.topActivity.getPackageName();
                    String baseAcName = info.baseActivity.getPackageName();
                    if (topAcName.equals(packageName) || baseAcName.equals(packageName)) {
                        isActive = true;
                        break;
                    }
                }


            }
        }

        return isActive;
    }


//    public void setComponent(ComponentName componentName, boolean enable) {
//        if (componentName == null) return;
//        getPackageManager().setComponentEnabledSetting(componentName
//                , enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED
//                , PackageManager.DONT_KILL_APP);
//
//    }


    /**
     * 修改App启动应用图标
     */
    /*public void switchAppIcon(SplashActivity activity) {
        try {
            //当前的
            ComponentName currentCN = activity.getComponentName();
            String cls = currentCN.getClassName();
            new LoggerUtil().e("===>>" + cls);


            //与AndroidManifest中对应的name一致
            //正常的启动页面
            String defaultClsName = "com.zb.yaowang.ui.activity.SplashActivity";
            //活动的
            String aliasNewYearName = "com.zb.yaowang.aliasNewYear";

            Context context = ZbApplication.getAppContext();

            ComponentName defaultCN = new ComponentName(context, defaultClsName);
            ComponentName newYearCN = new ComponentName(context, aliasNewYearName);

            //flag -1-不启用判断 0-正常 1-活动-新年
            int flag = (Integer) SpfUtil.getInstance().get(context, SpfUtil.KEY_APP_ICON_FLAG, -1);
            if (flag == 0) {
                setComponent(defaultCN, true);
                setComponent(newYearCN, false);
            } else if (flag == 1) {
                setComponent(defaultCN, false);
                setComponent(newYearCN, true);
            }
        } catch (Exception e) {

        }

    }*/


// *************************************************************************
// 获取版本信息（包名相关的）
// *************************************************************************
    public static ApplicationInfo getAppInfo(Context context) {
        ApplicationInfo applicationInfo = null;
        try {
            applicationInfo = getPackageManager(context).getApplicationInfo(
                    context.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        return applicationInfo;

    }


    public static Bitmap getAppIcon(Context context) {
        ApplicationInfo ai = getAppInfo(context);
        if (ai != null) {
            //xxx根据自己的情况获取drawable
            Drawable d = getPackageManager(context).getApplicationIcon(ai);
            BitmapDrawable bd = (BitmapDrawable) d;
            return bd.getBitmap();
        }
        return null;
    }


    /**
     * 获取配置的渠道
     * <meta-data
     * android:name="UMENG_CHANNEL"
     * android:value="${UMENG_CHANNEL_VALUE}"/>
     *
     * @param channelKey     meta-data 的name：如 "UMENG_CHANNEL"
     * @param defaultChannel 默认channel
     * @return
     */
    public static String getChannel(Context context, String channelKey, String defaultChannel) {
        String channel = defaultChannel;
        ApplicationInfo appInfo = null;
        try {
            appInfo = getPackageManager(context)
                    .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
            if (!channel.contains("$"))
                channel = appInfo.metaData.getString(channelKey);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return channel;
    }


///////////////////////////////////////////////////////////////////////////
//  PackageInfo
///////////////////////////////////////////////////////////////////////////

    public static PackageManager getPackageManager(Context context) {
        return context.getPackageManager();
    }

    public static PackageInfo getPackageInfo(Context context) {
        try {
            return getPackageManager(context).getPackageInfo(context.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String getPackageName(Context context) {
        PackageInfo pi = getPackageInfo(context);
        if (pi != null) {
            return pi.packageName;
        }
        return "";
    }

    public static String getAppName(Context context) {
        PackageInfo pi = getPackageInfo(context);
        if (pi != null) {
            int labelRes = pi.applicationInfo.labelRes;
            return context.getResources().getString(labelRes);
        }
        return "";
    }

    public static long getVerCode(Context context) {
        PackageInfo pi = getPackageInfo(context);
        if (pi != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                return pi.getLongVersionCode();
            } else {
                return pi.versionCode;
            }
        }
        return 0;
    }

    public static String getVerName(Context context) {
        PackageInfo pi = getPackageInfo(context);
        if (pi != null) {
            return pi.versionName;
        }
        return "";
    }


    /**
     * 根据包名获取意图
     *
     * @param context     上下文
     * @param packageName 包名
     * @return 意图
     */
    private static Intent getIntentByPackageName(Context context, String packageName) {
        return getPackageManager(context).getLaunchIntentForPackage(packageName);
    }



    /**
     * 根据包名判断App是否安装
     *
     * @param context     上下文
     * @param packageName 包名
     * @return {@code true}: 已安装   {@code false}: 未安装
     */
    public static boolean isInstallApp(Context context, String packageName) {
        return getIntentByPackageName(context, packageName) != null;
    }

    /**
     * 根据包名判断App是否安装
     *
     * @param context     上下文
     * @param packageName 包名
     * @return {@code true}: 已安装   {@code false}: 未安装
     */
    public static boolean isAppInstalled(Context context, String packageName) {
        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
        if (pinfo != null) {
            for (int i = 0; i < pinfo.size(); i++) {
                String pn = pinfo.get(i).packageName.toLowerCase(Locale.ENGLISH);
                if (pn.equals(packageName)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 打开指定包名的App
     *
     * @param context     上下文
     * @param packageName 包名
     * @return {@code true}: 打开成功  {@code false}: 打开失败
     */
    public static boolean openAppByPackageName(Context context, String packageName) {
        Intent intent = getIntentByPackageName(context, packageName);
        if (intent != null) {
            context.startActivity(intent);
            return true;
        }
        return false;
    }


    /**
     * 打开指定包名的App应用信息界面
     *
     * @param context 上下文
     */
    public static void openAppSetting(Context context) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + context.getPackageName()));
        context.startActivity(intent);
    }

///////////////////////////////////////////////////////////////////////////
//  获取设备ID :
//    deviceID的组成为：渠道标志+识别符来源标志+hash后的终端识别符
//    有很多场景和需求你需要用到手机设备的唯一标识符。（不管怎么取，最好能在本地保存一份）
//    * 识别符来源标志：
//            * 1， wifi mac地址（wifi）；
//            * 2， IMEI（imei）；
//            * 3， 序列号（sn）；
//            * 4， id：随机码。若前面的都取不到时，则随机生成一个随机码，需要缓存。
///////////////////////////////////////////////////////////////////////////

    public static TelephonyManager getTelephonyMgr(Context context) {
        return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    }

    public static WifiManager getWifiMgr(Context context) {
        return (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    }

//
//    public static String getDeviceID(Context context, String spfFileName) {
//        String deviceId = (String) SpfUtil.get(context, spfFileName, "deviceId", "");
//        if (TextUtils.isEmpty(deviceId)) {
//            deviceId = createDeviceId(context);
//            SpfUtil.put(context, spfFileName, "deviceId", deviceId);
//        }
//        return deviceId;
//    }

    @SuppressLint("HardwareIds")
//    private static String createDeviceId(Context context) {
//        StringBuilder deviceId = new StringBuilder();
//        try {
//            // 需要 ACCESS_WIFI_STATE
//            WifiInfo info = getWifiMgr(context).getConnectionInfo();
//            String wifiMac = info.getMacAddress();
//
//            if (!TextUtils.isEmpty(wifiMac)) {
//                deviceId.append("wifi");
//                deviceId.append(wifiMac);
//            }
//
//
//            //IMEI（imei） android.permission.READ_PHONE_STATE
//            TelephonyManager tm = getTelephonyMgr(context);
//            String imei = "";
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
//                        == PackageManager.PERMISSION_GRANTED) {
//                    imei = tm.getImei();
//                }
//            } else {
//                imei = tm.getDeviceId();
//            }
//
//            if (!TextUtils.isEmpty(imei)) {
//                deviceId.append("imei");
//                deviceId.append(imei);
//            }
//
//
//            // 序列号（sn）
//            String sn = tm.getSimSerialNumber();
//            if (!TextUtils.isEmpty(sn)) {
//                deviceId.append("sn");
//                deviceId.append(sn);
//            }
//
////            String androidID = Settings.Secure.getString(context.getContentResolver(),
////                    Settings.Secure.ANDROID_ID);
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        if (deviceId.length() <= 0) {
//            // 如果以上硬件标识数据均无法获得，
//            //则DeviceId默认使用系统随机数，这样保证DeviceId不为空
//            String uuid = UUID.randomUUID().toString().replace("-", "");
//            deviceId.append(uuid);
//        }
//
//        return MD5Util.md5_32(deviceId.toString());
//    }


//    public static void cancelRvDefaultAnimator(RecyclerView rv) {
//        if (rv == null) return;
//        //取消item的动画，防止item刷新产生闪烁
//        DefaultItemAnimator defaultItemAnimator = (DefaultItemAnimator) rv.getItemAnimator();
//        if (defaultItemAnimator != null) {
//            defaultItemAnimator.setSupportsChangeAnimations(false);
//        }
//    }


    /**
     * 打开本地文件器
     * @param fileType
     */
    public static void openFileSelector(Activity activity, String fileType) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        //设置类型，我这里是任意类型，任意后缀的可以这样写
        intent.setType(fileType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        activity.startActivityForResult(intent, CommonConstant.FILE_SELECTOR_REQUEST_CODE);
    }


    /**
     *  取进程名的方法“getProcessName”有多种实现方法，推荐方法如下：
     * 获取进程号对应的进程名
     *
     * @param pid 进程号
     * @return 进程名
     */
    public static String getProcessName(int pid) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
            String processName = reader.readLine();
            if (!TextUtils.isEmpty(processName)) {
                processName = processName.trim();
            }
            return processName;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException exception) {
                exception.printStackTrace();
            }
        }
        return null;
    }

///////////////////////////////////////////////////////////////////////////
// 按返回键退出应用
///////////////////////////////////////////////////////////////////////////

    private static long firstTime = 0;

    public static void exitApp(Context context) {
        long secondTime = System.currentTimeMillis();
        if (secondTime - firstTime > 2000) {
//            ToastUtil.show(context, "再按一次退出程序");
            firstTime = secondTime;
        } else {
            ActivityUtil.exitApp();
        }
    }

}
